package com.zyl.basis.state;

/**
 * @author zhaoyl
 * @date 2024/5/27 16:24
 * @description 说明
 * 1、守护线程和用户线程的区别
 * Java 中的线程可以分为两类：用户线程和守护线程（Daemon Thread）。
 * 它们之间的区别在于虚拟机在何时结束进程。
 *
 *用户线程是虚拟机启动的线程中的普通线程，当所有用户线程结束运行后，虚拟机才会停止运行，
 * 即使还有一些守护线程在运行。
 *
 *守护线程是在程序中创建的线程，它的作用是为其他线程提供服务。当所有的用户线程结束运行后，守护线程也会随之结束，
 * 而不管它是否执行完毕。守护线程通常用于执行一些辅助性任务，如垃圾回收、缓存清理等，它们不需要等待所有的任务完成后再退出。
 *
 *在 Java 中，可以使用 Thread 类的 setDaemon() 方法将一个线程设置为守护线程，
 * 也可以使用 isDaemon() 方法判断一个线程是否为守护线程。默认情况下，线程都是用户线程。
 *
 *需要注意的是，如果程序中的所有线程都是守护线程，那么虚拟机将立即退出。因此，在编写程序时，
 * 应该避免这种情况的出现
 *
 * 2、守护线程的作用及应用场景
 * 如果 JVM 中没有一个正在运行的非守护线程，这个时候，JVM 会退出。换句话说，
 * 守护线程拥有自动结束自己生命周期的特性，而用户线程不具备这个特点。
 *
 * JVM 中的垃圾回收线程就是典型的守护线程，如果说不具备该特性，会发生什么呢？
 *
 * 当 JVM 要退出时，由于垃圾回收线程还在运行着，导致程序无法退出，这就很尴尬了！！！由此可见，
 * 守护线程的重要性了。
 * 通常来说，守护线程经常被用来执行一些后台任务，但是呢，你又希望在程序退出时，或者说 JVM 退出时，
 * 线程能够自动关闭，此时，守护线程是你的首选。（后台操作日志，监控内存，垃圾回收等待）
 */
//测试守护线程
public class TestDaemon {
    public static void main(String[] args) {
        God god = new God();
        You you = new You();

        Thread thread = new Thread(god);
        //变为守护线程，用户线程结束后自动退出
        thread.setDaemon(true);//默认是false表示用户线程，正常线程都是用户线程

        thread.start();//上帝 守护线程启动

        new Thread(you).start();//你  用户线程启动...
    }
}


//上帝
class God implements Runnable{
    @Override
    public void run() {
        while (true){
            System.out.println("上帝线程running...");
        }
    }
}

//你
class You implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i <= 365; i++) {
            System.out.println("用户线程running...");
        }
    }
}
